package com.shujia.day13;

public class Demo08Ticks {
    public static void main(String[] args) {
        /*
            TODO:
                某电影院目前正在上映贺岁大片，共有100张票，而它有3个售票窗口售票，请设计一个程序模拟该电影院售票。
                分析:
                    而它有3个售票窗口售票 => 3个线程
                    共有100张票  => 表示3个线程的共有变量
                问题:
                    1.对于总的销售票数 会大于100张
                    2.对于票数可能会出现负数 不符合代码的执行逻辑
                总结:对于多个线程使用同一个变量,那么会造成线程不安全的问题
                        如何解决? => 线程同步 => 当使用一个变量时,会对当前变量进行加锁,不让其他线程获取到变量
                                                     但是其他线程可以获取到CPU的执行权
         */
        SellRunnable sellRunnable = new SellRunnable();
        Thread thread1 = new Thread(sellRunnable, "李玉龙");
        Thread thread2 = new Thread(sellRunnable, "豪哥");
        Thread thread3 = new Thread(sellRunnable, "陆玉龙");

        thread1.start();
        thread2.start();
        thread3.start();

    }

    // TODO 自己尝试完成
    static class SellThread extends Thread{

    }

    static class SellRunnable implements Runnable{
        int ticksNum = 100;
        @Override
        public void run() {
            while (ticksNum > 0){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                sell();
            }
        }


        // 销售的方法
        public void sell(){
            System.out.println("当前售票员:"+Thread.currentThread().getName()+"正在销售第"+ticksNum+"票");
            ticksNum -= 1;
        }
    }
}

